#第九章 符合python风格的对象

# classMethod和statiMethod

class Demo():
    myCode = '123'
    #使用该属性定义类的变量可以节省内存,子类不会继承父类的设置
    #__slots__ = ("name","doubleVal","__val") #在这个列表中的字段名才会被认为该类有效的属性名 否则会报错

    def __init__(self,val=1):
        self.__val = val #以两个下划线开头并且不以两个下划线结尾的变量是私有变量
        self.doubleVal = self.__val*2
        self.name = "hello"
      
        

    @classmethod
    def fn1(*args): #其实类方法始终有个默认参数 第一个是类本身
        print(args)
    
    @staticmethod #静态方法没有
    def fn2(*args):
        print(args)

Demo.fn1(12,'abc')
Demo.fn2('12','abc')

d = Demo()
d.myCode = '345' #动态为实例创建一个属性
print(d.myCode)
print(Demo.myCode) #类属性不会变
Demo.myCode = '789'
print(d.myCode) #实例属性依然不会变 

print(eval("[ i for i in range(0,5)]"))